A namespace is a bounded domain of names constructed according to one or more formation rules. Each name in the namespace typically yields a unique denotation within the scope of its domain. Namespaces abound in computing. For example, table names in a relational database, and member variables in a UML (Unified Modeling Language), Java, or C++ class constitute namespaces. For that matter, the names of all computer languages also constitute a namespace.
The practical use for namespaces in computer science has been to effect modularity. Namespaces are important to class encapsulations, generic programming, software modules, compilation units, and a variety of other artifacts of contemporary computing. Any namespace may contain an inventory of unique identifiers, each with discrete semantics. This makes it possible for a particular name to recur in multiple namespaces with a different denotation in each. Whenever a compiler, linker, interpreter, or database management system calls for a function or an instance of a particular element type, that request is satisfied using denotational semantics from an appropriate namespace.
Namespaces organize complexity. A namespace, for instance, may contain one or more other namespaces. For example, a column in a relational database table constitutes a namespace within a namespace. The type of a class member variable in a UML model may encapsulate a local namespace of types and functions. Likewise, a Java or C++ class contains a local namespace for its member functions, and each method described therein may contain yet another namespace for its own local variables.
A particular name may occur unambiguously in multiple namespaces. In computing environments where multiple namespaces exist, logical distinctions between them are typically maintained by the use of scope identifiers indicating how to resolve the identity of a name across namespaces. Compilers, linkers, interpreters, and database management systems encode the formation rules by which names are composed, and thus resolve such requests appropriately. In this way, the unique denotation of a name is maintained across namespaces.
Frequently, however, it is desirable to translate between namespaces. In multiple system contexts like data warehousing, e-commerce, web services, system-of-system engineering, and others, it is regularly necessary to correlate names with equivalent denotational semantics across namespaces. Given a name and its denotation from one namespace, the necessary operation discovers a name with equivalent denotational semantics in another. Usually this discovery enables data re-use and system interoperability. Unfortunately, the discovery operation resists automation. Today, in fact, it is habitually performed exclusively as a time-consuming, error-prone, manual task, one that has become a principle cost driver for computing in multiple system contexts. Since modem computing routinely involves multiple systems, this cost can be sufficiently high to impede progress.